"""
example03 - 编写实现对列表元素进行冒泡排序的函数

设计函数的时候，一定要注意函数的无副作用性（调用函数不影响调用者（即参数））

Author: Administrator
Date: 2024/1/23
"""


def bubble_sort(items, ascending=True, gt=lambda x, y: x > y) -> list:
    """
    冒泡排序

    :param items: 待排序的列表
    :param ascending: 是否使用升序
    :param gt: 比较两个元素大小的函数
    :return: 排序后的列表
    """
    items = items[:]
    for i in range(1, len(items)):
        swapped = False
        for j in range(0, len(items) - i):
            if gt(items[j], items[j + 1]):
                items[j], items[j + 1] = items[j + 1], items[j]
                swapped = True
        if not swapped:
            break
    if not ascending:
        items = items[::-1]
    return items


if __name__ == '__main__':
    # nums = [35, 96, 12, 78, 56, 64, 39, 80]
    # print(bubble_sort(nums))
    # print(nums)
    words = ['apple', 'watermelon', 'hello', 'zoo', 'internationalization']
    print(bubble_sort(words, gt=lambda x, y: len(x) > len(y), ascending=False))